package com.laobiao.file_netty_lib.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

import com.laobiao.file_netty_lib.exception.FileBaseException;
import com.laobiao.file_netty_lib.netty.server.ServerApplication;

public class FileUtil {
	/**
	 * 系统文件分片数据临时模板后缀
	 */
	private static final String LB_TMPLAT_SUFFIX = ".lbtemp";//

	/**
	 * 创建\获取分片模板文件
	 * 
	 * @param chunk    分片编号
	 * @param filePath 源文件路径
	 * @return
	 */
	public static File createTempFile(int chunk, String filePath) {
		File f = new File(getTempFilePath(chunk, filePath));
		if (!f.exists() || f.isDirectory()) {
			File parent = f.getParentFile();
			if (!parent.exists()) {
				parent.mkdirs();
			}
			try {
				f.createNewFile();
			} catch (Exception e) {
				// TODO: handle exception
				throw new FileBaseException("创建模板文件失败!", FileBaseException.ERR_UNPREDICTABLE);
			}

		}
		return f;
	}

	/**
	 * 创建模板文件
	 * 
	 * @param chunk    模板编号
	 * @param filePath 源文件路径
	 * @param data     要写入的数据
	 * @return
	 */
	public static File createTempFile(int chunk, String filePath, byte[] data) {
		File f = createTempFile(chunk, filePath);
		writeBytesToFile(f, data);
		return f;
	}

	public static void deleteTempFile(int chunk, String filePath) {
		File f = null;
		for (int x = 0; x < chunk; x++) {
			f = new File(getTempFilePath(x, filePath));
			try {
				f.delete();
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
//
//	/**
//	 * 根据最终要合并的文件路径查找响应的模板文件合并
//	 * 
//	 * @param chunk            模板文件分片数量
//	 * @param filePath         文件最终路径
//	 * @param afterMergeDelete 是否合并完成后删除
//	 * @return
//	 */
//	public static File mergeTempFile(int chunk, String filePath, boolean afterMergeDelete) {
//		File f = new File(ServerApplication.getServerBasePath() + filePath);
//		if (!f.exists() || f.isDirectory()) {
//			File parent = f.getParentFile();
//			if (!parent.exists()) {
//				parent.mkdirs();
//			}
//			try {
//				f.createNewFile();
//			} catch (Exception e) {
//				// TODO: handle exception
//				throw new FileBaseException("创建模板文件失败!", FileBaseException.ERR_UNPREDICTABLE);
//			}
//		}
//		FileOutputStream fout = null;
//		try {
//			try {
//				fout = new FileOutputStream(f);
//			} catch (Exception e) {
//				// TODO: handle exception
//				e.printStackTrace();
//			}
//			File tempFile = null;
//			FileInputStream tempIn = null;
//
//			for (int x = 0; x < chunk; x++) {
//				tempFile = new File(getTempFilePath(x, filePath));
//				try {
//					tempIn = new FileInputStream(tempFile);
//					long tempLength = tempFile.length();
//					long readSize = 0;
//					byte[] b = new byte[(int) Math.min(tempLength, ServerApplication.DATA_PACKET_SIZE)];
//					while (tempIn.read(b) != -1) {
//						fout.write(b);
//						readSize += b.length;
//						if (readSize >= tempLength)
//							break;
//						b = new byte[(int) Math.min(Math.abs(tempLength - readSize), ServerApplication.DATA_PACKET_SIZE)];
//					}
//				} catch (Exception e) {
//					// TODO: handle exception
//					throw new FileBaseException("获取模板文件失败！" + tempFile.getAbsolutePath(), e,
//							FileBaseException.ERR_UNPREDICTABLE);
//				} finally {
//					try {
//						tempIn.close();
//					} catch (Exception e) {
//						// TODO: handle exception
//					}
//				}
//			}
//
//		} finally {
//			try {
//				fout.close();
//			} catch (Exception e) {
//				// TODO: handle exception
//			}
//
//		}
//
//		if (afterMergeDelete) {
//			deleteTempFile(chunk, filePath);
//		}
//		return f;
//	}

	/**
	 * 根据分片编号构建\获取模板文件路径
	 * 
	 * @param chunk    分片编号
	 * @param filePath 源文件路径
	 * @return
	 */
	public static String getTempFilePath(int chunk, String filePath) {
		filePath = filePath + chunk + LB_TMPLAT_SUFFIX;
		return ServerApplication.getServerBasePath() + filePath;
	}

	/**
	 * 将数据写入文件
	 * 
	 * @param f    文件
	 * @param data 数据
	 */
	public static void writeBytesToFile(File f, byte[] data) {
		if (f == null || !f.exists() || !f.isFile()) {
			throw new FileBaseException("写入数据失败,文件错误!", FileBaseException.ERR_PARAM_NULL);
		}
		FileOutputStream out = null;
		try {
			try {
				out = new FileOutputStream(f);
				out.write(data);
			} catch (FileNotFoundException e) {
				// TODO: handle exception
				throw new FileBaseException("写入数据失败,文件不存在!", FileBaseException.ERR_PARAM_NULL);
			} catch (Exception e) {
				throw new FileBaseException("写入数据失败!", e, FileBaseException.ERR_PARAM_WRONG);
			}
		} finally {
			try {
				out.close();
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
	}

	/**
	 * 将数据写入文件
	 * 
	 * @param f    文件
	 * @param data 数据
	 */
	public static void writeBytesToFile(String filePath, byte[] data) {
		writeBytesToFile(new File(filePath), data);
	}

	public static boolean deleteFile(File remoteFile) {
		
		try {
			if(remoteFile.isDirectory()) {
				deleteFileAll(remoteFile);
				return true;
			}else {
				return remoteFile.delete();
			}
		} catch (Exception e) {
			return false;
		}
	}
	
	/**
	 * 删除文件下所有文件夹和文件
	 * file：文件名
	 * */
	public static void deleteFileAll(File file) {
		if (file.exists()) {
			File files[] = file.listFiles();
			int len = files.length;
			for (int i = 0; i < len; i++) {
				if (files[i].isDirectory()) {
					deleteFileAll(files[i]);
				} else {
					files[i].delete();
				}
			}
			file.delete();
		}
	}
	public static String getRestfulAddress(String key,String path) {
        Properties pps = new Properties();
        try {
            String dir2 = System.getProperty("user.dir") + 
                    File.separator +path + File.separator 
                    + "config.properties";
            FileInputStream fs = new FileInputStream(dir2);
            InputStreamReader in = new InputStreamReader (fs, "UTF-8");
            pps.load(in);
            String restfulAddress = pps.getProperty(key);
            in.close();
            return restfulAddress;
        } catch (Exception e) {
            e.printStackTrace();
        }  
        return null;
    }

}